 Validator = {
	Require : /.+/,
	Address: /^[\u0391-\uFFE5A-Za-z0-9._#\(\)\-\s]+$/,
	EnAddress: /^[A-Za-z0-9._#\(\)\-\s]+$/,
	Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
    Phone : /^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,4}\)|0\d{2,4}-)?[1-9]\d{6,7}(\-\d{1,4})?$/,
	ContractPhone : /^(((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,4}\)|0\d{2,4}-)?[1-9]\d{6,7}(\-\d{1,4})?)|(((\(\d{3}\))|(\d{3}\-))?13\d{9})$/,
	PhoneNo: /^[1-9]\d{4,19}$/,
	Mobile : /^((\(\d{3}\))|(\d{3}\-))?1[3578]\d{9}$/,
	Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,
	Path : /^((\\[a-zA-Z0-9]+)*(\\)?[a-zA-Z0-9]+\.[a-zA-Z0-9]+)$/,
	IDCard : /^((\d{15})|(\d{17}[a-zA-Z0-9]))$/,
	Currency : /^\d{1,9}(\.\d{0,2})?$/,
	CurrencyAdjust : /^[\+-]?\d{1,5}(\.\d{2,2})?$/,
	Number : /^\d+$/,
    HotkeyNumber: /^\d{1,6}$/,
	PhoneLike : /^\d+[-]?\d*$/,
	PayNumber : /^[1-9]\d+$/,
	CardNumber:/^d{8,20}$/,
	Zip : /^[1-9]\d{5}$/,
	QQ : /^[1-9]\d{4,8}$/,
	Integer : /^([-\+]?([1-9]\d{0,20})|0)$/,
	PInteger : /^(([0-9]\d{0,20})|0)$/,	
	Double : /^[-\+]?(([1-9]\d*)|0)(\.\d+)?$/,
	SqlString: /^[^\\':："“”;；.。,，]+$/,
	MaxString: /^.{0,20}$/,
	Name : /^[a-zA-Z]\w{0,}$/,
	NameB : /^\w{1,}$/,
	Chars : /^[a-zA-Z0-9]+$/,
	Chinese :  /^[\u0391-\uFFE5]+$/,
	SendToList: /^(([\u0391-\uFFE5\sA-Za-z0-9])+(,[\u0391-\uFFE5\sA-Za-z0-9]+)*)$/,
	English :  /^[a-zA-Z\s]+$/,
	Point2float : /^[-\+]?(([1-9]\d*)|0)(\.\d{1,2})?$/,
	ChargeFee : /^(([1-9]\d*)|0)(\.\d{1,2})?$/,
	TimeDiff    : /^([-\+](([1-9][0-9]*)|0)(\.[0-9]+)?)$/,
	PersonName: /^[\u0391-\uFFE5A-Za-z0-9._-]+$/,
	AllName  : /^[\u0391-\uFFE5A-Za-z0-9._-]+$/,
	Username : /^[a-zA-Z0-9](\w|-){0,}$/i,
	OrgNo    : /^(\d{4}){1,8}$/,
	NotChar:/^[\u4E00-\u9FA5A-Za-z0-9]+$/,
	IsIpAddress : "this.IsIpAddressFun(value)",
	IntRange    : "this.IntRangeFun(value,getAttribute('min'),getAttribute('max'))",
	UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/,
	IsSafe : function(str){return !this.UnSafe.test(str);},
	SafeString : "this.IsSafe(value)",
	Limit : "this.limit(value.length,getAttribute('min'),  getAttribute('max'))",
	LimitB : "this.limit(this.LenB(value), getAttribute('min'), getAttribute('max'))",
	Date : "this.IsDate(value, getAttribute('min'), getAttribute('format'))",
	Repeat : "value == document.getElementsByName(getAttribute('to'))[0].value",
	Range : "getAttribute('min') <= (value*1) && (value*1) <= getAttribute('max')&& value.trim() != ''",
	Compare : "this.compare(value,getAttribute('operator'),getAttribute('to'))",
	Custom : "this.Exec(value, getAttribute('regexp'))",
	Group : "this.MustChecked(getAttribute('name'), getAttribute('min'), getAttribute('max'))",
	ErrorItem : [document.forms[0]],
	ErrorMessage : ["您的输入有误，请先修正下列问题：\t\t"],
	Validate : function(theForm, mode){
		var obj = theForm || event.srcElement;
		var count = obj.elements.length;
		this.ErrorMessage.length = 1;
		this.ErrorItem.length = 1;
		this.ErrorItem[0] = obj;
		for(var i=0;i<count;i++){
			with(obj.elements[i]){
				if(getAttribute("readonly") == true || disabled == true) continue;
				var _dataType = getAttribute("data-dataType");
				if(typeof(_dataType) == "object" || typeof(this[_dataType]) == "undefined")  continue;
				this.ClearState(obj.elements[i]);
				
				if((getAttribute("data-require")==null || getAttribute("data-require")=="" || getAttribute("data-require") == "false") && value == "") continue;
				if(getAttribute("type") =="text" || getAttribute("type") =="password") value = value.trim();
				switch(_dataType){
					case "Date" :
					case "Repeat" :
					case "Range" :
					case "Compare" :
					case "Custom" :
					case "Group" :
					case "Limit" :
					case "LimitB" :
					case "SafeString" :
					case "IsIpAddress" :
					case "IntRange":
						if(!eval(this[_dataType]))	{
							this.AddError(i, getAttribute("data-msg"));
						}
						break;
					default :
						if(!this[_dataType].test(value)){
							this.AddError(i, getAttribute("data-msg"));
						}
						break;
				}
			}
		}
		if(this.ErrorMessage.length > 1){
			mode = mode || 1;
			var errCount = this.ErrorItem.length;
			switch(mode){
			case 2 :
				for(var i=1;i<errCount;i++)
					this.ErrorItem[i].style.color = "red";
				case 1 :
                suixun.alert(this.ErrorMessage.join("\n"));
                // alert(this.ErrorMessage.join("\n"),false);
       			/*var ErrParent=this.ErrorItem[1]
       			while(ErrParent.tagName != "BODY"&& (typeof(ErrParent)!="object" || ErrParent.tagName != "SPAN"))
       			   {
       			   ErrParent=ErrParent.parentNode;
       			   }
       			if(ErrParent.style.display = "none")
       			{ErrParent.style.display = "block";
       			}
       			if(this.ErrorItem[1].type != "hidden" && this.ErrorItem[1].type != "checkbox" && this.ErrorItem[1].type != "radio")
       			{
       			  this.ErrorItem[1].focus();
       			}*/
       			break;
			case 3 :
				for(var i=1;i<errCount;i++){
				try{
					var span = document.createElement("SPAN");
					span.id = "__ErrorMessagePanel";
					span.style.color = "red";
					this.ErrorItem[i].parentNode.appendChild(span);
					span.innerHTML = this.ErrorMessage[i].replace(/\d+:/,"*");
					}
					catch(e)
					{
						suixun.alert(e.description);
						// alert(e.description);
					}
				}
				
				this.ErrorItem[1].focus();
				break;
				default :
                suixun.alert(this.ErrorMessage.join("\n"));
                // alert(this.ErrorMessage.join("\n"),false);
				break;
			}
			return false;
		}
		return true;
	},
	limit : function(len,min, max){
		min = min || 0;
		max = max || Number.MAX_VALUE;
		return min <= len && len <= max;
	},
	LenB : function(str){
		return str.replace(/[^\x00-\xff]/g,"**").length;
	},
	ClearState : function(elem){
		with(elem){
			if(style.color == "red")
				style.color = "";
			var lastNode = parentNode.childNodes[parentNode.childNodes.length-1];
			if(lastNode.id == "__ErrorMessagePanel")
				parentNode.removeChild(lastNode);
		}
	},
	AddError : function(index, str){
		this.ErrorItem[this.ErrorItem.length] = this.ErrorItem[0].elements[index];
		this.ErrorMessage[this.ErrorMessage.length] = this.ErrorMessage.length + ":" + str;
	},
	Exec : function(op, reg){
		return new RegExp(reg,"g").test(op);
	},
	IsIpAddressFun : function(str){          
		ss = str.split('.'); 
		if(ss.length != 4)
	  		return false;
    	for(var i=0; i<ss.length; i++)
    	{
     		if( ss[i] != '*' &&	(ss[i] == '' || isNaN(ss[i]) || (parseInt(ss[i]) > 255) ))
				return false;
	    }
    	return true;
    },
    IntRangeFun :function(value,min,max)
    {   
        if(isNaN(value))
        return false;
        if((value - Math.floor(value)) != 0)
        return false;
        if(((value | 0 ) == 0) && value != '0' )
        return false;
        if(((value|0) < min) || ((value|0) > max) )
        return false;
        return true;
    },
	compare : function(op1,operator,op2){
		switch (operator) {
			case "NotEqual":
				return (op1 != op2);
			case "GreaterThan":
				return (op1 > op2);
			case "GreaterThanEqual":
				return (op1 >= op2);
			case "LessThan":
				return (op1 < op2);
			case "LessThanEqual":
				return (op1 <= op2);
			default:
				return (op1 == op2);
		}
	},
	MustChecked : function(name, min, max){
		var groups = document.getElementsByName(name);
		var hasChecked = 0;
		min = min || 1;
		max = max || groups.length;
		for(var i=groups.length-1;i>=0;i--)
			if(groups[i].checked) hasChecked++;
		return min <= hasChecked && hasChecked <= max;
	},
	IsDate : function(op, formatString){
		formatString = formatString || "ymd";
		var m, year, month, day;
		switch(formatString){
			case "ymd" :
				m = op.match(new RegExp("^((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})$"));
				if(m == null ) return false;
				day = m[6];
				month = m[5]*1;
				year =  (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));
				break;
			case "dmy" :
				m = op.match(new RegExp("^(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))$"));
				if(m == null ) return false;
				day = m[1];
				month = m[3]*1;
				year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10));
				break;
			default :
				break;
		}
		if(!parseInt(month)) return false;
		month = month==0 ?12:month;
		var date = new Date(year, month-1, day);
        return (typeof(date) == "object" && year == date.getFullYear() && month == (date.getMonth()+1) && day == date.getDate());
		function GetFullYear(y){return ((y<30 ? "20" : "19") + y)|0;}
	}
 }

String.prototype.trim = function()
{
    return this.replace(/(^\s*)|(\s*$)/g, "");
}

String.prototype.len = function()
{
   return this.replace(/[^\x00-\xff]/g,"aa").length;
}